defmodule EliPhxPlay.Repo.Migrations.CreateUserRelationships do
  use Ecto.Migration

  def change do
    # 创建用户关系表，管理用户之间的好友关系
    create table(:user_relationships, primary_key: false) do
      # 关系记录唯一标识符
      add :relationship_id, :binary_id, primary_key: true, comment: "关系记录唯一标识符"

      # 用户A的ID，外键关联users表，级联删除
      add :user_a_id, references(:users, column: :user_id, type: :binary_id, on_delete: :delete_all),
          comment: "用户A的ID"

      # 用户B的ID，外键关联users表，级联删除
      add :user_b_id, references(:users, column: :user_id, type: :binary_id, on_delete: :delete_all),
          comment: "用户B的ID"

      # 关系状态：pending(待确认)、accepted(已接受)、blocked(已屏蔽)
      add :relationship_status, :string, null: false, default: "pending",
          comment: "关系状态: pending/accepted/blocked"

      # 用户A对用户B的备注名称，可选
      add :remark_name, :string, comment: "备注名称"

      # 自动添加创建时间和更新时间
      timestamps()
    end

    # 为用户A创建索引，快速查询用户A的所有关系
    create index(:user_relationships, [:user_a_id], comment: "用户A关系查询索引")

    # 为用户B创建索引，快速查询用户B的所有关系
    create index(:user_relationships, [:user_b_id], comment: "用户B关系查询索引")

    # 创建复合唯一索引，防止重复添加好友关系
    create unique_index(:user_relationships, [:user_a_id, :user_b_id],
          comment: "防止重复好友关系的唯一索引")

    # 添加约束：用户不能添加自己为好友
    create constraint(:user_relationships, :no_self_relationship,
          check: "user_a_id != user_b_id", comment: "防止用户添加自己为好友")
  end
end
